home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_teamorders.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  10.2 KB  |  428 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. /*
  4. =======================================================================
  5.  
  6. TEAM ORDERS MENU
  7.  
  8. =======================================================================
  9. */
  10.  
  11.  
  12. #include "ui_local.h"
  13.  
  14.  
  15. #define ART_FRAME        "menu/art/addbotframe"
  16. #define ART_BACK0        "menu/art/back_0"
  17. #define ART_BACK1        "menu/art/back_1"    
  18.  
  19. #define ID_LIST_BOTS        10
  20. #define ID_LIST_CTF_ORDERS    11
  21. #define ID_LIST_TEAM_ORDERS    12
  22.  
  23.  
  24. typedef struct {
  25.     menuframework_s    menu;
  26.  
  27.     menutext_s        banner;
  28.     menubitmap_s    frame;
  29.  
  30.     menulist_s        list;
  31.  
  32.     menubitmap_s    back;
  33.  
  34.     int                gametype;
  35.     int                numBots;
  36.     int                selectedBot;
  37.     char            *bots[9];
  38.     char            botNames[9][16];
  39. } teamOrdersMenuInfo_t;
  40.  
  41. static teamOrdersMenuInfo_t    teamOrdersMenuInfo;
  42.  
  43. #define NUM_CTF_ORDERS        7
  44. static const char *ctfOrders[] = {
  45.     "I Am the Leader",
  46.     "Defend the Base",
  47.     "Follow Me",
  48.     "Get Enemy Flag",
  49.     "Camp Here",
  50.     "Report",
  51.     "I Relinquish Command",
  52.     NULL
  53. };
  54. static const char *ctfMessages[] = {
  55.     "i am the leader",
  56.     "%s defend the base",
  57.     "%s follow me",
  58.     "%s get enemy flag",
  59.     "%s camp here",
  60.     "%s report",
  61.     "i stop being the leader",
  62.     NULL
  63. };
  64.  
  65. #define NUM_TEAM_ORDERS        6
  66. static const char *teamOrders[] = {
  67.     "I Am the Leader",
  68.     "Follow Me",
  69.     "Roam",
  70.     "Camp Here",
  71.     "Report",
  72.     "I Relinquish Command",
  73.     NULL
  74. };
  75. static const char *teamMessages[] = {
  76.     "i am the leader",
  77.     "%s follow me",
  78.     "%s roam",
  79.     "%s camp here",
  80.     "%s report",
  81.     "i stop being the leader",
  82.     NULL
  83. };
  84.  
  85.  
  86. /*
  87. ===============
  88. UI_TeamOrdersMenu_BackEvent
  89. ===============
  90. */
  91. static void UI_TeamOrdersMenu_BackEvent( void *ptr, int event ) {
  92.     if( event != QM_ACTIVATED ) {
  93.         return;
  94.     }
  95.     UI_PopMenu();
  96. }
  97.  
  98.  
  99. /*
  100. ===============
  101. UI_TeamOrdersMenu_SetList
  102. ===============
  103. */
  104. static void UI_TeamOrdersMenu_SetList( int id ) {
  105.     switch( id ) {
  106.     default:
  107.     case ID_LIST_BOTS:
  108.         teamOrdersMenuInfo.list.generic.id = id;
  109.         teamOrdersMenuInfo.list.numitems = teamOrdersMenuInfo.numBots;
  110.         teamOrdersMenuInfo.list.itemnames = (const char **)teamOrdersMenuInfo.bots;
  111.          break;
  112.  
  113.     case ID_LIST_CTF_ORDERS:
  114.         teamOrdersMenuInfo.list.generic.id = id;
  115.         teamOrdersMenuInfo.list.numitems = NUM_CTF_ORDERS;
  116.         teamOrdersMenuInfo.list.itemnames = ctfOrders;
  117.         break;
  118.  
  119.     case ID_LIST_TEAM_ORDERS:
  120.         teamOrdersMenuInfo.list.generic.id = id;
  121.         teamOrdersMenuInfo.list.numitems = NUM_TEAM_ORDERS;
  122.         teamOrdersMenuInfo.list.itemnames = teamOrders;
  123.         break;
  124.     }
  125.  
  126.     teamOrdersMenuInfo.list.generic.bottom = teamOrdersMenuInfo.list.generic.top + teamOrdersMenuInfo.list.numitems * PROP_HEIGHT;
  127. }
  128.  
  129.  
  130. /*
  131. =================
  132. UI_TeamOrdersMenu_Key
  133. =================
  134. */
  135. sfxHandle_t UI_TeamOrdersMenu_Key( int key ) {
  136.     menulist_s    *l;
  137.     int    x;
  138.     int    y;
  139.     int    index;
  140.  
  141.     l = (menulist_s    *)Menu_ItemAtCursor( &teamOrdersMenuInfo.menu );
  142.     if( l != &teamOrdersMenuInfo.list ) {
  143.         return Menu_DefaultKey( &teamOrdersMenuInfo.menu, key );
  144.     }
  145.  
  146.     switch( key ) {
  147.         case K_MOUSE1:
  148.             x = l->generic.left;
  149.             y = l->generic.top;
  150.             if( UI_CursorInRect( x, y, l->generic.right - x, l->generic.bottom - y ) ) {
  151.                 index = (uis.cursory - y) / PROP_HEIGHT;
  152.                 l->oldvalue = l->curvalue;
  153.                 l->curvalue = index;
  154.  
  155.                 if( l->generic.callback ) {
  156.                     l->generic.callback( l, QM_ACTIVATED );
  157.                     return menu_move_sound;
  158.                 }
  159.             }
  160.             return menu_null_sound;
  161.  
  162.         case K_KP_UPARROW:
  163.         case K_UPARROW:
  164.             l->oldvalue = l->curvalue;
  165.  
  166.             if( l->curvalue == 0 ) {
  167.                 l->curvalue = l->numitems - 1;
  168.             }
  169.             else {
  170.                 l->curvalue--;
  171.             }
  172.             return menu_move_sound;
  173.  
  174.         case K_KP_DOWNARROW:
  175.         case K_DOWNARROW:
  176.             l->oldvalue = l->curvalue;
  177.  
  178.             if( l->curvalue == l->numitems - 1 ) {
  179.                 l->curvalue = 0;;
  180.             }
  181.             else {
  182.                 l->curvalue++;
  183.             }
  184.             return menu_move_sound;
  185.     }
  186.  
  187.     return Menu_DefaultKey( &teamOrdersMenuInfo.menu, key );
  188. }
  189.  
  190.  
  191. /*
  192. =================
  193. UI_TeamOrdersMenu_ListDraw
  194. =================
  195. */
  196. static void UI_TeamOrdersMenu_ListDraw( void *self ) {
  197.     menulist_s    *l;
  198.     int            x;
  199.     int            y;
  200.     int            i;
  201.     float        *color;
  202.     qboolean    hasfocus;
  203.     int            style;
  204.  
  205.     l = (menulist_s *)self;
  206.  
  207.     hasfocus = (l->generic.parent->cursor == l->generic.menuPosition);
  208.  
  209.     x =    320;//l->generic.x;
  210.     y =    l->generic.y;
  211.     for( i = 0; i < l->numitems; i++ ) {
  212.         style = UI_LEFT|UI_SMALLFONT|UI_CENTER;
  213.         if( i == l->curvalue ) {
  214.             color = color_yellow;
  215.             if( hasfocus ) {
  216.                 style |= UI_PULSE;
  217.             }
  218.         }
  219.         else {
  220.             color = color_orange;
  221.         }
  222.  
  223.         UI_DrawProportionalString( x, y, l->itemnames[i], style, color );
  224.         y += PROP_HEIGHT;
  225.     }
  226. }
  227.  
  228.  
  229. /*
  230. ===============
  231. UI_TeamOrdersMenu_ListEvent
  232. ===============
  233. */
  234. static void UI_TeamOrdersMenu_ListEvent( void *ptr, int event ) {
  235.     int        id;
  236.     int        selection;
  237.     char    message[256];
  238.  
  239.     if (event != QM_ACTIVATED)
  240.         return;
  241.  
  242.     id = ((menulist_s *)ptr)->generic.id;
  243.     selection = ((menulist_s *)ptr)->curvalue;
  244.  
  245.     if( id == ID_LIST_BOTS ) {
  246.         teamOrdersMenuInfo.selectedBot = selection;
  247.         if( teamOrdersMenuInfo.gametype == GT_CTF ) {
  248.             UI_TeamOrdersMenu_SetList( ID_LIST_CTF_ORDERS );
  249.         }
  250.         else {
  251.             UI_TeamOrdersMenu_SetList( ID_LIST_TEAM_ORDERS );
  252.         }
  253.         return;
  254.     }
  255.  
  256.     if( id == ID_LIST_CTF_ORDERS ) {
  257.         Com_sprintf( message, sizeof(message), ctfMessages[selection], teamOrdersMenuInfo.botNames[teamOrdersMenuInfo.selectedBot] );
  258.     }
  259.     else {
  260.         Com_sprintf( message, sizeof(message), teamMessages[selection], teamOrdersMenuInfo.botNames[teamOrdersMenuInfo.selectedBot] );
  261.     }
  262.  
  263.     trap_Cmd_ExecuteText( EXEC_APPEND, va( "say_team \"%s\"\n", message ) );
  264.     UI_PopMenu();
  265. }
  266.  
  267.  
  268. /*
  269. ===============
  270. UI_TeamOrdersMenu_BuildBotList
  271. ===============
  272. */
  273. static void UI_TeamOrdersMenu_BuildBotList( void ) {
  274.     uiClientState_t    cs;
  275.     int        numPlayers;
  276.     int        isBot;
  277.     int        n;
  278.     char    playerTeam;
  279.     char    botTeam;
  280.     char    info[MAX_INFO_STRING];
  281.  
  282.     for( n = 0; n < 9; n++ ) {
  283.         teamOrdersMenuInfo.bots[n] = teamOrdersMenuInfo.botNames[n];
  284.     }
  285.  
  286.     trap_GetClientState( &cs );
  287.  
  288.     Q_strncpyz( teamOrdersMenuInfo.botNames[0], "Everyone", 16 );
  289.     teamOrdersMenuInfo.numBots = 1;
  290.  
  291.     trap_GetConfigString( CS_SERVERINFO, info, sizeof(info) );
  292.     numPlayers = atoi( Info_ValueForKey( info, "sv_maxclients" ) );
  293.     teamOrdersMenuInfo.gametype = atoi( Info_ValueForKey( info, "g_gametype" ) );
  294.  
  295.     for( n = 0; n < numPlayers && teamOrdersMenuInfo.numBots < 9; n++ ) {
  296.         trap_GetConfigString( CS_PLAYERS + n, info, MAX_INFO_STRING );
  297.  
  298.         if( n == cs.clientNum ) {
  299.             playerTeam = *Info_ValueForKey( info, "t" );
  300.             continue;
  301.         }
  302.  
  303.         isBot = atoi( Info_ValueForKey( info, "skill" ) );
  304.         if( !isBot ) {
  305.             continue;
  306.         }
  307.  
  308.         botTeam = *Info_ValueForKey( info, "t" );
  309.         if( botTeam != playerTeam ) {
  310.             continue;
  311.         }
  312.  
  313.         Q_strncpyz( teamOrdersMenuInfo.botNames[teamOrdersMenuInfo.numBots], Info_ValueForKey( info, "n" ), 16 );
  314.         Q_CleanStr( teamOrdersMenuInfo.botNames[teamOrdersMenuInfo.numBots] );
  315.         teamOrdersMenuInfo.numBots++;
  316.     }
  317. }
  318.  
  319.  
  320. /*
  321. ===============
  322. UI_TeamOrdersMenu_Init
  323. ===============
  324. */
  325. static void UI_TeamOrdersMenu_Init( void ) {
  326.     UI_TeamOrdersMenu_Cache();
  327.  
  328.     memset( &teamOrdersMenuInfo, 0, sizeof(teamOrdersMenuInfo) );
  329.     teamOrdersMenuInfo.menu.fullscreen = qfalse;
  330.     teamOrdersMenuInfo.menu.key = UI_TeamOrdersMenu_Key;
  331.  
  332.     UI_TeamOrdersMenu_BuildBotList();
  333.  
  334.     teamOrdersMenuInfo.banner.generic.type        = MTYPE_BTEXT;
  335.     teamOrdersMenuInfo.banner.generic.x            = 320;
  336.     teamOrdersMenuInfo.banner.generic.y            = 16;
  337.     teamOrdersMenuInfo.banner.string            = "TEAM ORDERS";
  338.     teamOrdersMenuInfo.banner.color                = color_white;
  339.     teamOrdersMenuInfo.banner.style                = UI_CENTER;
  340.  
  341.     teamOrdersMenuInfo.frame.generic.type        = MTYPE_BITMAP;
  342.     teamOrdersMenuInfo.frame.generic.flags        = QMF_INACTIVE;
  343.     teamOrdersMenuInfo.frame.generic.name        = ART_FRAME;
  344.     teamOrdersMenuInfo.frame.generic.x            = 320-233;
  345.     teamOrdersMenuInfo.frame.generic.y            = 240-166;
  346.     teamOrdersMenuInfo.frame.width                = 466;
  347.     teamOrdersMenuInfo.frame.height                = 332;
  348.  
  349.     teamOrdersMenuInfo.list.generic.type        = MTYPE_SCROLLLIST;
  350.     teamOrdersMenuInfo.list.generic.flags        = QMF_PULSEIFFOCUS;
  351.     teamOrdersMenuInfo.list.generic.ownerdraw    = UI_TeamOrdersMenu_ListDraw;
  352.     teamOrdersMenuInfo.list.generic.callback    = UI_TeamOrdersMenu_ListEvent;
  353.     teamOrdersMenuInfo.list.generic.x            = 320-64;
  354.     teamOrdersMenuInfo.list.generic.y            = 120;
  355.  
  356.     teamOrdersMenuInfo.back.generic.type        = MTYPE_BITMAP;
  357.     teamOrdersMenuInfo.back.generic.name        = ART_BACK0;
  358.     teamOrdersMenuInfo.back.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  359.     teamOrdersMenuInfo.back.generic.callback    = UI_TeamOrdersMenu_BackEvent;
  360.     teamOrdersMenuInfo.back.generic.x            = 0;
  361.     teamOrdersMenuInfo.back.generic.y            = 480-64;
  362.     teamOrdersMenuInfo.back.width                = 128;
  363.     teamOrdersMenuInfo.back.height                = 64;
  364.     teamOrdersMenuInfo.back.focuspic            = ART_BACK1;
  365.  
  366.     Menu_AddItem( &teamOrdersMenuInfo.menu, &teamOrdersMenuInfo.banner );
  367.     Menu_AddItem( &teamOrdersMenuInfo.menu, &teamOrdersMenuInfo.frame );
  368.     Menu_AddItem( &teamOrdersMenuInfo.menu, &teamOrdersMenuInfo.list );
  369.     Menu_AddItem( &teamOrdersMenuInfo.menu, &teamOrdersMenuInfo.back );
  370.  
  371.     teamOrdersMenuInfo.list.generic.left = 220;
  372.     teamOrdersMenuInfo.list.generic.top = teamOrdersMenuInfo.list.generic.y;
  373.     teamOrdersMenuInfo.list.generic.right = 420;
  374.     UI_TeamOrdersMenu_SetList( ID_LIST_BOTS );
  375. }
  376.  
  377.  
  378. /*
  379. =================
  380. UI_TeamOrdersMenu_Cache
  381. =================
  382. */
  383. void UI_TeamOrdersMenu_Cache( void ) {
  384.     trap_R_RegisterShaderNoMip( ART_FRAME );
  385.     trap_R_RegisterShaderNoMip( ART_BACK0 );
  386.     trap_R_RegisterShaderNoMip( ART_BACK1 );
  387. }
  388.  
  389.  
  390. /*
  391. ===============
  392. UI_TeamOrdersMenu
  393. ===============
  394. */
  395. void UI_TeamOrdersMenu( void ) {
  396.     UI_TeamOrdersMenu_Init();
  397.     UI_PushMenu( &teamOrdersMenuInfo.menu );
  398. }
  399.  
  400.  
  401. /*
  402. ===============
  403. UI_TeamOrdersMenu_f
  404. ===============
  405. */
  406. void UI_TeamOrdersMenu_f( void ) {
  407.     uiClientState_t    cs;
  408.     char    info[MAX_INFO_STRING];
  409.     int        team;
  410.  
  411.     // make sure it's a team game
  412.     trap_GetConfigString( CS_SERVERINFO, info, sizeof(info) );
  413.     teamOrdersMenuInfo.gametype = atoi( Info_ValueForKey( info, "g_gametype" ) );
  414.     if( teamOrdersMenuInfo.gametype < GT_TEAM ) {
  415.         return;
  416.     }
  417.  
  418.     // not available to spectators
  419.     trap_GetClientState( &cs );
  420.     trap_GetConfigString( CS_PLAYERS + cs.clientNum, info, MAX_INFO_STRING );
  421.     team = atoi( Info_ValueForKey( info, "t" ) );
  422.     if( team == TEAM_SPECTATOR ) {
  423.         return;
  424.     }
  425.  
  426.     UI_TeamOrdersMenu();
  427. }
  428.